1
1

00:00:00,840  -->  00:00:03,090
<v جوناس>دعونا نواصل رحلتنا</v>
2

2

00:00:03,090  -->  00:00:07,330
من التعمق في كيفية عمل JavaScript فعليًا
3

3

00:00:07,330  -->  00:00:08,960
خلف الكواليس.
4

4

00:00:08,960  -->  00:00:11,450
آمل حقًا أن تكون قد استمتعت به حتى الآن
5

5

00:00:11,450  -->  00:00:14,370
وهم قادرون على رؤية القيمة الهائلة
6

6

00:00:14,370  -->  00:00:17,460
أن هذه المحاضرات تجلب إلى الطاولة.
7

7

00:00:17,460  -->  00:00:19,170
والآن بعد هذه المحاضرة
8

8

00:00:19,170  -->  00:00:22,560
سيكون هناك أخيرًا محاضرة برمجة أخرى.
9

9

00:00:22,560  -->  00:00:25,223
لذا انتظروا، نحن على وشك الوصول.
10

10

00:00:27,070  -->  00:00:30,770
ولكن الآن دعونا نبدأ بهذه المحاضرة.
11

11

00:00:30,770  -->  00:00:33,430
هكذا تعلمنا في المحاضرة الأخيرة
12

12

00:00:33,430  -->  00:00:37,810
أن كل سياق تنفيذ له بيئة متغيرة،
13

13

00:00:37,810  -->  00:00:41,340
سلسلة النطاق والكلمة الرئيسية هذه.
14

14

00:00:41,340  -->  00:00:44,510
لذلك في هذه المحاضرة، دعونا نتعلم ما هو النطاق
15

15

00:00:44,510  -->  00:00:46,200
وسلسلة النطاق هي،
16

16

00:00:46,200  -->  00:00:49,970
لماذا هي مهمة جدا وكيف تعمل.
17

17

00:00:49,970  -->  00:00:51,930
ولنبدأ بالفهم
18

18

00:00:51,930  -->  00:00:54,190
ما يعنيه النطاق في الواقع،
19

19

00:00:54,190  -->  00:00:57,930
والتعرف على بعض المفاهيم ذات الصلة أيضًا.
20

20

00:00:57,930  -->  00:01:02,250
لذا فإن تحديد النطاق يتحكم في كيفية عمل متغيرات برنامجنا
21

21

00:01:02,250  -->  00:01:06,293
يتم تنظيمها والوصول إليها بواسطة محرك JavaScript.
22

22

00:01:07,140  -->  00:01:10,430
لذا فإن تحديد النطاق يطرح السؤال بشكل أساسي،
23

23

00:01:10,430  -->  00:01:12,560
أين تعيش المتغيرات؟
24

24

00:01:12,560  -->  00:01:16,993
أو أين يمكننا الوصول إلى متغير معين وأين لا؟
25

25

00:01:18,030  -->  00:01:19,330
الآن في جافا سكريبت،
26

26

00:01:19,330  -->  00:01:22,720
لدينا شيء يسمى النطاق المعجمي.
27

27

00:01:22,720  -->  00:01:26,060
والنطاق المعجمي يعني أن طريقة المتغيرات
28

28

00:01:26,060  -->  00:01:28,330
يتم تنظيمها والوصول إليها
29

29

00:01:28,330  -->  00:01:32,400
يتم التحكم فيه بالكامل من خلال وضع الوظائف
30

30

00:01:32,400  -->  00:01:35,710
والكتل في رمز البرامج.
31

31

00:01:35,710  -->  00:01:39,470
على سبيل المثال، وظيفة مكتوبة في الداخل
32

32

00:01:39,470  -->  00:01:42,940
وظيفة أخرى لديها حق الوصول إلى المتغيرات
33

33

00:01:42,940  -->  00:01:45,930
وظيفة الوالدين، حسنا؟
34

34

00:01:45,930  -->  00:01:49,550
لذا مرة أخرى، يتأثر النطاق المتغير
35

35

00:01:49,550  -->  00:01:54,550
من خلال المكان الذي نكتب فيه وظائفنا وكتل التعليمات البرمجية بالضبط.
36

36

00:01:55,120  -->  00:01:58,370
حسنًا، والآن عن النطاق نفسه.
37

37

00:01:58,370  -->  00:02:01,300
النطاق هو الفضاء أو البيئة
38

38

00:02:01,300  -->  00:02:04,430
حيث يتم الإعلان عن متغير معين،
39

39

00:02:04,430  -->  00:02:06,230
بهذه البساطة.
40

40

00:02:06,230  -->  00:02:08,050
وفي حالة الوظائف
41

41

00:02:08,050  -->  00:02:10,870
هذا هو في الأساس البيئة المتغيرة
42

42

00:02:10,870  -->  00:02:15,020
والتي يتم تخزينها في سياق تنفيذ الوظائف.
43

43

00:02:15,020  -->  00:02:17,210
لذلك إذا كنت تسأل نفسك الآن،
44

44

00:02:17,210  -->  00:02:19,460
ما هو الفرق بين النطاق
45

45

00:02:19,460  -->  00:02:21,770
والبيئة المتغيرة؟
46

46

00:02:21,770  -->  00:02:25,510
ثم الجواب هو أنه بالنسبة لحالة الوظائف،
47

47

00:02:25,510  -->  00:02:27,730
انها في الأساس نفس الشيء.
48

48

00:02:27,730  -->  00:02:30,770
الآن في جافا سكريبت، لدينا النطاق العالمي،
49

49

00:02:30,770  -->  00:02:33,690
نطاق الوظيفة، ونطاق الكتلة.
50

50

00:02:33,690  -->  00:02:36,340
وسوف نتحدث عن هذه في الثانية.
51

51

00:02:36,340  -->  00:02:39,560
لكن أولاً، دعونا أيضًا نحدد النطاق
52

52

00:02:39,560  -->  00:02:41,620
من المتغير هو.
53

53

00:02:41,620  -->  00:02:46,590
وبالتالي فإن نطاق المتغير هو في الأساس المنطقة بأكملها
54

54

00:02:46,590  -->  00:02:51,170
من الكود الخاص بنا، حيث يمكن الوصول إلى متغير معين.
55

55

00:02:51,170  -->  00:02:55,170
الآن، بعض الناس يستخدمون كلمة نطاق لكل هذا،
56

56

00:02:55,170  -->  00:02:58,600
لكني أحب أن أحدد كل هذه المفاهيم التي لدينا هنا
57

57

00:02:58,600  -->  00:03:03,160
بطريقة واضحة، وذلك لأن الاختلافات الدقيقة في الواقع.
58

58

00:03:03,160  -->  00:03:06,070
على سبيل المثال، إذا ألقيت نظرة فاحصة عليه،
59

59

00:03:06,070  -->  00:03:09,940
النطاق ليس هو نفس نطاق المتغير.
60

60

00:03:09,940  -->  00:03:14,430
ولذا يجب أن تعرف الاختلافات الدقيقة، أليس كذلك؟
61

61

00:03:14,430  -->  00:03:18,240
وأنا أعلم أنه قد لا يزال يبدو كما هو في الوقت الحالي،
62

62

00:03:18,240  -->  00:03:21,040
ولكن بعد النظر في بضعة أمثلة
63

63

00:03:21,040  -->  00:03:23,050
وكتابة بعض التعليمات البرمجية الحقيقية،
64

64

00:03:23,050  -->  00:03:26,563
سوف تفهم كل ما أظهرته لك هنا للتو.
65

65

00:03:27,840  -->  00:03:31,000
على أية حال، دعونا نتحدث الآن عن الأنواع الثلاثة المختلفة
66

66

00:03:31,000  -->  00:03:33,470
من النطاق في جافا سكريبت.
67

67

00:03:33,470  -->  00:03:38,470
هذا هو النطاق العالمي ونطاق الوظيفة ونطاق الكتلة.
68

68

00:03:38,750  -->  00:03:42,030
وتذكر أن النطاق هو المكان الموجود في الكود الخاص بنا
69

69

00:03:42,030  -->  00:03:44,940
حيث يتم الإعلان عن المتغيرات.
70

70

00:03:44,940  -->  00:03:48,310
وعندما أقول المتغيرات، نفس الشيء بالضبط
71

71

00:03:48,310  -->  00:03:50,800
صحيح بالنسبة للوظائف أيضًا.
72

72

00:03:50,800  -->  00:03:54,420
لأنه في النهاية، الوظائف هي مجرد قيم
73

73

00:03:54,420  -->  00:03:56,990
التي يتم تخزينها في المتغيرات.
74

74

00:03:56,990  -->  00:04:01,120
أولاً، النطاق العالمي مرة أخرى
75

75

00:04:01,120  -->  00:04:03,430
للحصول على رمز المستوى الأعلى.
76

76

00:04:03,430  -->  00:04:06,270
لذلك هذا للمتغيرات التي تم الإعلان عنها
77

77

00:04:06,270  -->  00:04:09,930
خارج أي وظيفة أو كتلة.
78

78

00:04:09,930  -->  00:04:12,840
وستكون هذه المتغيرات متاحة في كل مكان
79

79

00:04:12,840  -->  00:04:17,050
في برنامجنا، في جميع الوظائف وجميع الكتل.
80

80

00:04:17,050  -->  00:04:19,830
حقا، في كل مكان.
81

81

00:04:19,830  -->  00:04:23,730
بعد ذلك، تقوم كل وظيفة بإنشاء نطاق.
82

82

00:04:23,730  -->  00:04:27,120
والمتغيرات المعلنة داخل نطاق الوظيفة هذا
83

83

00:04:27,120  -->  00:04:30,230
لا يمكن الوصول إليها إلا داخل تلك الوظيفة.
84

84

00:04:30,230  -->  00:04:33,230
ويسمى هذا أيضًا بالنطاق المحلي
85

85

00:04:33,230  -->  00:04:35,800
يتعارض مع النطاق العالمي.
86

86

00:04:35,800  -->  00:04:40,150
لذلك تعيش المتغيرات المحلية في الوظيفة إذا جاز التعبير.
87

87

00:04:40,150  -->  00:04:41,920
وخارج الوظيفة،
88

88

00:04:41,920  -->  00:04:45,740
ثم لا يمكن الوصول إلى المتغيرات على الإطلاق.
89

89

00:04:45,740  -->  00:04:48,390
مرة أخرى، هذا هو نفسه من الناحية الفنية
90

90

00:04:48,390  -->  00:04:51,130
كبيئة الوظائف المتغيرة،
91

91

00:04:51,130  -->  00:04:54,280
لكننا ما زلنا بحاجة إلى إعطائه اسم النطاق
92

92

00:04:54,280  -->  00:04:55,510
في هذا السياق،
93

93

00:04:55,510  -->  00:04:58,610
لأن الكتل تنشئ نطاقات أيضًا.
94

94

00:04:58,610  -->  00:05:01,010
على أية حال، في هذا المثال هنا،
95

95

00:05:01,010  -->  00:05:06,010
المتغير الآن هو 2037 داخل وظيفة الترس H.
96

96

00:05:06,560  -->  00:05:09,240
ومن ثم، يمكننا استخدامه في الدالة
97

97

00:05:09,240  -->  00:05:10,960
للقيام بالحسابات.
98

98

00:05:10,960  -->  00:05:13,260
لكن خارج الوظيفة،
99

99

00:05:13,260  -->  00:05:15,730
أثناء محاولتنا تسجيله إلى وحدة التحكم،
100

100

00:05:15,730  -->  00:05:18,440
نحصل على خطأ مرجعي.
101

101

00:05:18,440  -->  00:05:22,010
لذا تحاول JavaScript العثور على المتغير الآن
102

102

00:05:22,010  -->  00:05:23,770
في هذا النطاق العالمي،
103

103

00:05:23,770  -->  00:05:27,370
لذلك خارج الوظيفة، ولكن لا يمكن العثور عليها.
104

104

00:05:27,370  -->  00:05:29,750
وبالتالي سيكون هناك خطأ.
105

105

00:05:29,750  -->  00:05:32,430
وإذا كنت تتذكر، أو اختر مشروع اللعبة
106

106

00:05:32,430  -->  00:05:34,060
من القسم السابق ,
107

107

00:05:34,060  -->  00:05:36,820
هناك أيضًا سبب اضطرارنا للإعلان
108

108

00:05:36,820  -->  00:05:41,080
اثنين من المتغيرات خارج وظيفة init،
109

109

00:05:41,080  -->  00:05:42,410
تذكر ذلك؟
110

110

00:05:42,410  -->  00:05:45,920
لذلك كان لدينا بعض المتغيرات المعلنة في دالة init،
111

111

00:05:45,920  -->  00:05:47,570
وبعد ذلك أعطانا خطأ
112

112

00:05:47,570  -->  00:05:50,030
لأن وظائف أخرى كانت تحاول
113

113

00:05:50,030  -->  00:05:51,860
للوصول إلى هذه المتغيرات.
114

114

00:05:51,860  -->  00:05:54,580
لكن بالطبع كانوا في نطاق الوظيفة.
115

115

00:05:54,580  -->  00:05:56,860
وهكذا تم تحديد نطاقهم محليًا،
116

116

00:05:56,860  -->  00:05:58,210
ولذا لم نتمكن من الوصول إليهم
117

117

00:05:58,210  -->  00:06:02,400
خارج تلك الوظيفة حيث تم الإعلان عنها.
118

118

00:06:02,400  -->  00:06:04,610
وهنا، في الواقع لا يهم
119

119

00:06:04,610  -->  00:06:07,230
ما نوع الوظيفة التي نستخدمها.
120

120

00:06:07,230  -->  00:06:10,380
إذن إعلانات الوظائف، وتعبيرات الوظائف
121

121

00:06:10,380  -->  00:06:14,223
ووظائف السهم جميعها تنشئ نطاقًا خاصًا بها.
122

122

00:06:15,260  -->  00:06:19,500
الآن، تقليديًا، يتم استخدام الوظائف فقط لإنشاء النطاقات
123

123

00:06:19,500  -->  00:06:20,850
في جافا سكريبت.
124

124

00:06:20,850  -->  00:06:25,850
ولكن بدءًا من ES6، تقوم الكتل أيضًا بإنشاء النطاقات الآن.
125

125

00:06:25,860  -->  00:06:26,810
ومع الكتل
126

126

00:06:26,810  -->  00:06:29,970
ونعني كل ما هو بين الأقواس المتعرجة،
127

127

00:06:29,970  -->  00:06:34,510
مثل كتلة عبارة if أو حلقة for.
128

128

00:06:34,510  -->  00:06:36,920
تمامًا كما هو الحال مع الوظائف،
129

129

00:06:36,920  -->  00:06:39,570
المتغيرات المعلنة داخل الكتلة
130

130

00:06:39,570  -->  00:06:42,350
لا يمكن الوصول إليها إلا داخل تلك الكتلة
131

131

00:06:42,350  -->  00:06:44,970
وليس خارجا عنه.
132

132

00:06:44,970  -->  00:06:47,950
الآن، الفرق الكبير هو أن نطاقات الحظر
133

133

00:06:47,950  -->  00:06:52,950
تنطبق فقط على المتغيرات المعلنة باستخدام Let أو const، حسنًا؟
134

134

00:06:53,540  -->  00:06:57,500
لذا مرة أخرى، فقط متغيرات Let وconst
135

135

00:06:57,500  -->  00:07:01,600
تقتصر على الكتلة التي تم إنشاؤها فيها.
136

136

00:07:01,600  -->  00:07:04,910
لهذا السبب نقول أن متغيرات Let و const
137

137

00:07:04,910  -->  00:07:06,710
يتم تحديد نطاق الكتلة.
138

138

00:07:06,710  -->  00:07:10,890
لذا، إذا قمت بالإعلان عن متغير باستخدام var في هذه الكتلة،
139

139

00:07:10,890  -->  00:07:14,520
عندها سيظل هذا المتغير متاحًا بالفعل
140

140

00:07:14,520  -->  00:07:16,550
خارج الكتلة،
141

141

00:07:16,550  -->  00:07:19,430
وسيتم نطاقها إلى الوظيفة الحالية
142

142

00:07:19,430  -->  00:07:21,410
أو إلى النطاق العالمي.
143

143

00:07:21,410  -->  00:07:25,570
ولذا نقول أن var يتم تحديد نطاقه بالوظيفة.
144

144

00:07:25,570  -->  00:07:27,970
لذلك في ES5 وما قبله،
145

145

00:07:27,970  -->  00:07:31,260
لم يكن لدينا سوى النطاق العالمي ونطاق الوظيفة.
146

146

00:07:31,260  -->  00:07:35,400
ولهذا السبب تم الإعلان عن متغيرات ES5 باستخدام var،
147

147

00:07:35,400  -->  00:07:39,080
تهتم فقط بالوظائف، ولكن ليس بالكتل.
148

148

00:07:39,080  -->  00:07:40,960
إنهم ببساطة يتجاهلونهم.
149

149

00:07:40,960  -->  00:07:44,170
أخيرًا، بدءًا من ES6 أيضًا،
150

150

00:07:44,170  -->  00:07:47,070
تم الآن أيضًا حظر جميع الوظائف،
151

151

00:07:47,070  -->  00:07:49,010
على الأقل في الوضع الصارم،
152

152

00:07:49,010  -->  00:07:52,040
والتي يجب أن تستخدمها دائمًا على أي حال.
153

153

00:07:52,040  -->  00:07:55,420
وكما هو الحال مع متغيرات Let وconst،
154

154

00:07:55,420  -->  00:07:58,750
هذا يعني أن الوظائف المعلنة داخل الكتلة
155

155

00:07:58,750  -->  00:08:03,410
لا يمكن الوصول إليها إلا داخل تلك الكتلة، حسنا؟
156

156

00:08:03,410  -->  00:08:06,730
وسنرى أمثلة على كل ذلك في الفيديو التالي،
157

157

00:08:06,730  -->  00:08:09,023
عندما سنعود إلى البرمجة.
158

158

00:08:10,230  -->  00:08:13,930
لذا، لتلخيص المتغيرات، Let وconst
159

159

00:08:13,930  -->  00:08:17,260
وكذلك يتم تحديد نطاق الوظائف.
160

160

00:08:17,260  -->  00:08:20,440
وإذا كنت تعرف بالفعل لغات البرمجة الأخرى،
161

161

00:08:20,440  -->  00:08:23,090
من المحتمل أن يكون نطاق الكتلة أكثر انسجاما
162

162

00:08:23,090  -->  00:08:25,230
مع ما تعرفه بالفعل.
163

163

00:08:25,230  -->  00:08:28,680
نطاقات الوظائف غريبة بالنسبة لبعض المبتدئين
164

164

00:08:28,680  -->  00:08:30,400
في عالم جافا سكريبت.
165

165

00:08:30,400  -->  00:08:35,070
ولهذا السبب تم تقديم نطاقات الحظر في ES6.
166

166

00:08:35,070  -->  00:08:38,440
ولكن الآن لفهم كل هذا بشكل أفضل قليلاً،
167

167

00:08:38,440  -->  00:08:42,560
دعونا ننظر في الواقع إلى مثال أكثر واقعية وتفصيلا
168

168

00:08:42,560  -->  00:08:45,493
وتعرف أيضًا على سلسلة النطاق.
169

169

00:08:47,520  -->  00:08:50,520
وهنا لدينا بعض التعليمات البرمجية بوظائف مختلفة
170

170

00:08:50,520  -->  00:08:51,650
والكتل،
171

171

00:08:51,650  -->  00:08:53,720
وسنلقي نظرة على النطاقات
172

172

00:08:53,720  -->  00:08:58,330
الموجودة في هذا الكود وكذلك بناء سلسلة النطاق.
173

173

00:08:58,330  -->  00:09:02,290
وبالطبع، نبدأ بالنطاق العالمي.
174

174

00:09:02,290  -->  00:09:05,030
كما ترون، المتغير myName
175

175

00:09:05,030  -->  00:09:07,360
هو الإعلان المتغير الوحيد
176

176

00:09:07,360  -->  00:09:10,100
التي لدينا في النطاق العالمي.
177

177

00:09:10,100  -->  00:09:12,600
الآن، من الناحية الفنية، الوظيفة الأولى
178

178

00:09:12,600  -->  00:09:14,700
يعتبر أيضًا متغيرًا
179

179

00:09:14,700  -->  00:09:17,010
الموجود على النطاق العالمي،
180

180

00:09:17,010  -->  00:09:18,870
لكني أريد أن أبقي الأمر بسيطًا هنا.
181

181

00:09:18,870  -->  00:09:22,180
ولذلك سأفكر فقط في الإعلانات المتغيرة
182

182

00:09:22,180  -->  00:09:24,510
ولا وظائف، كل الحق؟
183

183

00:09:24,510  -->  00:09:27,500
فقط ضع في اعتبارك أن كل ما أشرحه هنا
184

184

00:09:27,500  -->  00:09:31,363
للمتغيرات تعمل أيضًا بنفس الطريقة بالنسبة للوظائف.
185

185

00:09:32,310  -->  00:09:35,020
على أية حال، داخل النطاق العالمي،
186

186

00:09:35,020  -->  00:09:38,220
لدينا نطاق للوظيفة الأولى
187

187

00:09:38,220  -->  00:09:42,820
لأن كل وظيفة تخلق نطاقها الخاص، تذكر؟
188

188

00:09:42,820  -->  00:09:44,970
وما هو في نطاق؟
189

189

00:09:44,970  -->  00:09:47,870
حسنًا، لقد تم الإعلان عن متغير العمر
190

190

00:09:47,870  -->  00:09:50,500
مباشرة في الجزء العلوي من الوظيفة.
191

191

00:09:50,500  -->  00:09:52,960
التالي داخل النطاق الأول،
192

192

00:09:52,960  -->  00:09:55,670
لننظر الآن إلى الوظيفة الثانية،
193

193

00:09:55,670  -->  00:09:58,270
والتي سوف تخلق أيضا نطاقها الخاص
194

194

00:09:58,270  -->  00:10:01,820
يحتوي على متغير الوظيفة المعين للمعلم.
195

195

00:10:01,820  -->  00:10:03,060
لذا كما ترى،
196

196

00:10:03,060  -->  00:10:06,400
لدينا بنية متداخلة من النطاقات
197

197

00:10:06,400  -->  00:10:09,490
مع نطاق واحد داخل الآخر.
198

198

00:10:09,490  -->  00:10:12,680
ولكن الآن يأتي الجزء المثير للاهتمام حقًا.
199

199

00:10:12,680  -->  00:10:15,200
لأنه هنا في الوظيفة الثانية،
200

200

00:10:15,200  -->  00:10:17,180
لدينا هذا السطر من التعليمات البرمجية
201

201

00:10:17,180  -->  00:10:19,810
حيث نحتاج إلى متغير myName
202

202

00:10:19,810  -->  00:10:21,610
ومتغير العمر
203

203

00:10:21,610  -->  00:10:26,070
والتي لم يتم الإعلان عنها داخل النطاق الحالي.
204

204

00:10:26,070  -->  00:10:28,720
ولكننا نحتاج حقًا إلى هذه المتغيرات هنا،
205

205

00:10:28,720  -->  00:10:33,530
لأنه بخلاف ذلك لا يمكننا إنشاء هذه السلسلة هنا، أليس كذلك؟
206

206

00:10:33,530  -->  00:10:35,700
فكيف يمكن إصلاح هذا؟
207

207

00:10:35,700  -->  00:10:38,890
كيف سيعرف محرك جافا سكريبت القيم
208

208

00:10:38,890  -->  00:10:40,970
من هذه المتغيرات ؟
209

209

00:10:40,970  -->  00:10:43,730
حسنا، السر هو أن كل نطاق
210

210

00:10:43,730  -->  00:10:46,520
دائما لديه حق الوصول إلى كافة المتغيرات
211

211

00:10:46,520  -->  00:10:49,050
من جميع نطاقاتها الخارجية.
212

212

00:10:49,050  -->  00:10:51,710
لذلك من جميع نطاقاتها الأم.
213

213

00:10:51,710  -->  00:10:54,970
في مثالنا، هذا يعني أن النطاق الثاني
214

214

00:10:54,970  -->  00:10:57,950
يمكن الوصول إلى متغير العمر من النطاق
215

215

00:10:57,950  -->  00:10:59,900
من الوظيفة الأولى.
216

216

00:10:59,900  -->  00:11:03,010
وبطبيعة الحال، وهذا يعني أيضا أن النطاق الأول
217

217

00:11:03,010  -->  00:11:06,690
يمكن الوصول إلى المتغيرات الموجودة في النطاق العالمي،
218

218

00:11:06,690  -->  00:11:09,560
لأن هذا هو النطاق الأصلي.
219

219

00:11:09,560  -->  00:11:11,480
ونتيجة لذلك،
220

220

00:11:11,480  -->  00:11:14,870
سيكون النطاق الثاني أيضًا قادرًا على الوصول
221

221

00:11:14,870  -->  00:11:18,140
متغير myName من النطاق العالمي،
222

222

00:11:18,140  -->  00:11:21,030
لأنه لديه حق الوصول إلى المتغيرات
223

223

00:11:21,030  -->  00:11:22,713
من النطاق الأول.
224

224

00:11:23,670  -->  00:11:28,180
وبالمناسبة، كل هذا ينطبق أيضًا على الوسائط الوظيفية.
225

225

00:11:28,180  -->  00:11:31,043
لكن في هذا المثال، ليس لدينا أي منها.
226

226

00:11:31,900  -->  00:11:36,590
وهذه هي الطريقة الأساسية التي تعمل بها سلسلة النطاق.
227

227

00:11:36,590  -->  00:11:37,650
وبعبارة أخرى،
228

228

00:11:37,650  -->  00:11:41,130
إذا كان نطاق واحد يحتاج إلى استخدام متغير معين،
229

229

00:11:41,130  -->  00:11:43,940
ولكن لا يمكن العثور عليه في النطاق الحالي،
230

230

00:11:43,940  -->  00:11:46,460
سوف يبحث في سلسلة النطاق
231

231

00:11:46,460  -->  00:11:48,840
ومعرفة ما إذا كان يمكن العثور على متغير
232

232

00:11:48,840  -->  00:11:51,060
في أحد النطاقات الأم.
233

233

00:11:51,060  -->  00:11:54,160
إذا كان ذلك ممكنًا، فسوف يستخدم هذا المتغير.
234

234

00:11:54,160  -->  00:11:57,620
وإذا لم يستطع، فسيكون هناك خطأ.
235

235

00:11:57,620  -->  00:12:00,503
وتسمى هذه العملية بالبحث المتغير.
236

236

00:12:01,870  -->  00:12:04,710
الآن من المهم أن نلاحظ أن هذه المتغيرات
237

237

00:12:04,710  -->  00:12:09,460
لا يتم نسخها من نطاق واحد إلى آخر، حسنا؟
238

238

00:12:09,460  -->  00:12:13,190
بدلاً من ذلك، تبحث النطاقات ببساطة في سلسلة النطاق
239

239

00:12:13,190  -->  00:12:15,970
حتى يجدوا المتغير الذي يحتاجونه
240

240

00:12:15,970  -->  00:12:17,940
ومن ثم يستخدمونه.
241

241

00:12:17,940  -->  00:12:20,760
ما هو مهم للغاية أيضًا أن نلاحظه
242

242

00:12:20,760  -->  00:12:24,240
هو أن هذا لا يعمل في الاتجاه المعاكس.
243

243

00:12:24,240  -->  00:12:27,560
لن يتمكن نطاق معين من الوصول أبدًا
244

244

00:12:27,560  -->  00:12:29,940
لمتغيرات النطاق الداخلي.
245

245

00:12:29,940  -->  00:12:33,650
في هذا المثال، النطاق الأول، على سبيل المثال،
246

246

00:12:33,650  -->  00:12:36,900
لن تتمكن أبدًا من الوصول إلى متغير الوظيفة
247

247

00:12:36,900  -->  00:12:40,840
التي يتم تخزينها في النطاق الثاني، حسنا؟
248

248

00:12:40,840  -->  00:12:45,460
لذا مرة أخرى، يمكن لنطاق واحد فقط البحث في سلسلة النطاق،
249

249

00:12:45,460  -->  00:12:48,520
لكنها لا تستطيع أن تنظر إلى الأسفل بشكل أساسي.
250

250

00:12:48,520  -->  00:12:50,840
لذلك يمكن استخدام النطاق الأصلي فقط،
251

251

00:12:50,840  -->  00:12:52,603
ولكن لا يوجد نطاقات فرعية.
252

252

00:12:53,450  -->  00:12:56,220
على أية حال، مع كل هذا في مكانه الآن،
253

253

00:12:56,220  -->  00:12:58,690
يمكن تنفيذ هذا السطر من التعليمات البرمجية
254

254

00:12:58,690  -->  00:13:00,400
والطباعة إلى وحدة التحكم.
255

255

00:13:00,400  -->  00:13:03,390
جوناس مدرس يبلغ من العمر 30 عامًا،
256

256

00:13:03,390  -->  00:13:06,460
على الرغم من متغيرات myName والعمر
257

257

00:13:06,460  -->  00:13:09,260
لم يتم تعريفها في النطاق الحالي.
258

258

00:13:09,260  -->  00:13:13,950
كل ما فعله المحرك هو إخراجهم من سلسلة النطاق.
259

259

00:13:13,950  -->  00:13:16,140
وكما قد تلاحظون،
260

260

00:13:16,140  -->  00:13:20,180
لقد فعلنا هذا بالفعل من قبل في الكود الخاص بنا.
261

261

00:13:20,180  -->  00:13:23,520
نحن فقط لم نفهم حقا ما كان يحدث
262

262

00:13:23,520  -->  00:13:25,300
وكيف عملت كل شيء.
263

263

00:13:25,300  -->  00:13:27,940
لكننا الآن نعرف كيف يعمل.
264

264

00:13:27,940  -->  00:13:29,233
مذهل، أليس كذلك؟
265

265

00:13:30,180  -->  00:13:33,870
على أية حال، لا يزال لدينا مجال آخر متبقي هنا،
266

266

00:13:33,870  -->  00:13:36,993
وهذا هو الذي أنشأته هذه الكتلة هنا.
267

267

00:13:38,010  -->  00:13:40,880
تذكر أنه بدءًا من ES6،
268

268

00:13:40,880  -->  00:13:45,130
لا تقوم الوظائف فقط بإنشاء النطاقات، ولكن أيضًا الكتل.
269

269

00:13:45,130  -->  00:13:49,810
ومع ذلك، تعمل هذه النطاقات فقط مع أنواع المتغيرات ES6.
270

270

00:13:49,810  -->  00:13:52,930
لذلك بالنسبة للمتغيرات Let و const.
271

271

00:13:52,930  -->  00:13:56,010
لهذا السبب المتغير الوحيد الموجود في النطاق
272

272

00:13:56,010  -->  00:13:58,480
هو متغير العقد.
273

273

00:13:58,480  -->  00:14:02,650
لم يتم التصريح عن المتغير الألفي باستخدام const أو Let،
274

274

00:14:02,650  -->  00:14:07,380
وبالتالي لا يقتصر نطاقه على هذه الكتلة فقط.
275

275

00:14:07,380  -->  00:14:11,270
وبدلا من ذلك، فإن المتغير الألفي هو في الواقع جزء
276

276

00:14:11,270  -->  00:14:13,580
من نطاق الوظيفة الأولى.
277

277

00:14:13,580  -->  00:14:17,780
لذا مرة أخرى، بالنسبة للمتغير المُعلن باستخدام var،
278

278

00:14:17,780  -->  00:14:20,490
نطاقات الحظر لا تنطبق على الإطلاق.
279

279

00:14:20,490  -->  00:14:24,160
إنها وظائف ذات نطاق محدد، وليست ذات نطاق محدد.
280

280

00:14:24,160  -->  00:14:26,700
Let and const من ناحية أخرى
281

281

00:14:26,700  -->  00:14:30,440
هي في الواقع كتل نطاقها، حسنا؟
282

282

00:14:30,440  -->  00:14:32,690
هذا هو واحد من الأشياء الأساسية
283

283

00:14:32,690  -->  00:14:36,710
التي يجب أن تضعها في اعتبارك بشأن Let وconst وvar،
284

284

00:14:36,710  -->  00:14:39,760
وحول النطاق بشكل عام.
285

285

00:14:39,760  -->  00:14:43,280
لذا، إذا كنت تقوم بتدوين الملاحظات وآمل أن تقوم بتدوينها
286

286

00:14:43,280  -->  00:14:44,970
الكثير من الملاحظات،
287

287

00:14:44,970  -->  00:14:47,543
فمن المؤكد أن هذا يجب أن يكون هناك.
288

288

00:14:48,450  -->  00:14:50,330
الآن عن سلسلة النطاق،
289

289

00:14:50,330  -->  00:14:54,043
إذا كان المتغير الألفي في نطاق الوظيفة الأول،
290

290

00:14:54,043  -->  00:14:57,010
ثم بالطبع نطاق الوظيفة الثانية
291

291

00:14:57,010  -->  00:14:59,130
وله أيضًا إمكانية الوصول إليه،
292

292

00:14:59,130  -->  00:15:02,550
حتى لو لم تكن بحاجة حقًا إلى هذا المتغير.
293

293

00:15:02,550  -->  00:15:04,810
كما تفعل سلسلة النطاق بالطبع،
294

294

00:15:04,810  -->  00:15:07,500
تنطبق على نطاقات الحظر أيضًا.
295

295

00:15:07,500  -->  00:15:10,400
وبالتالي في نطاق الحظر أو في حالة حظره،
296

296

00:15:10,400  -->  00:15:13,120
يمكننا الوصول إلى جميع المتغيرات
297

297

00:15:13,120  -->  00:15:15,670
من جميع نطاقاتها الخارجية.
298

298

00:15:15,670  -->  00:15:17,950
لذلك من نطاق الوظيفة الأول،
299

299

00:15:17,950  -->  00:15:20,890
وبالطبع من النطاق العالمي.
300

300

00:15:20,890  -->  00:15:23,090
ولهذا السبب قلت في الشريحة الأخيرة
301

301

00:15:23,090  -->  00:15:25,110
أن المتغيرات في نطاق عالمي
302

302

00:15:25,110  -->  00:15:27,640
يمكن الوصول إليها من كل مكان.
303

303

00:15:27,640  -->  00:15:29,760
إنهم كذلك، لأنهم دائمًا كذلك
304

304

00:15:29,760  -->  00:15:32,290
في الجزء العلوي من سلسلة النطاق.
305

305

00:15:32,290  -->  00:15:35,350
في الواقع، نحن نسمي المتغيرات في النطاق العالمي،
306

306

00:15:35,350  -->  00:15:39,200
المتغيرات العالمية، خلاقة جدا، أليس كذلك؟
307

307

00:15:39,200  -->  00:15:43,670
لكننا في الواقع نستخدم هذا المصطلح كثيرًا في JavaScript.
308

308

00:15:43,670  -->  00:15:45,630
الآن من المهم أن نفهم
309

309

00:15:45,630  -->  00:15:47,890
أن نطاق الكتل الأرجواني لدينا
310

310

00:15:47,890  -->  00:15:50,920
لا يستطيع الوصول إلى أي متغيرات
311

311

00:15:50,920  -->  00:15:53,890
من نطاق الوظيفة الثانية الصفراء.
312

312

00:15:53,890  -->  00:15:56,240
ونفس الشيء، على العكس من ذلك.
313

313

00:15:56,240  -->  00:15:58,070
ولماذا ذلك؟
314

314

00:15:58,070  -->  00:16:00,920
حسنًا، هذا بسبب النطاق المعجمي
315

315

00:16:00,920  -->  00:16:03,230
كما تعلمنا في الشريحة الأخيرة.
316

316

00:16:03,230  -->  00:16:05,710
وبالتالي فإن الطريقة التي يمكننا من خلالها الوصول إلى المتغيرات
317

317

00:16:05,710  -->  00:16:08,660
يعتمد على مكان وضع النطاق،
318

318

00:16:08,660  -->  00:16:11,650
حتى حيث هو مكتوب في التعليمات البرمجية.
319

319

00:16:11,650  -->  00:16:14,730
في هذه الحالة، لم يتم كتابة أي من هذين النطاقين
320

320

00:16:14,730  -->  00:16:17,110
داخل بعضها البعض.
321

321

00:16:17,110  -->  00:16:20,810
كلاهما نطاقات فرعية للوظيفة الأولى.
322

322

00:16:20,810  -->  00:16:24,400
يمكننا حتى أن نقول أنهم نطاقات الأخوة.
323

323

00:16:24,400  -->  00:16:27,250
وهكذا وفقا لقواعد النطاق المعجمي،
324

324

00:16:27,250  -->  00:16:31,070
لا يمكنهم الوصول إلى متغيرات بعضهم البعض،
325

325

00:16:31,070  -->  00:16:35,530
ببساطة لأن أحدهما غير مكتوب داخل الآخر.
326

326

00:16:35,530  -->  00:16:37,540
يمكننا أن نقول أيضا أن سلسلة النطاق
327

327

00:16:37,540  -->  00:16:40,803
يعمل فقط للأعلى، وليس جانبية.
328

328

00:16:41,860  -->  00:16:45,200
حسنًا، لقد كان هذا كثيرًا لاستيعابه،
329

329

00:16:45,200  -->  00:16:48,430
لكني آمل أن يظل كل شيء منطقيًا
330

330

00:16:48,430  -->  00:16:49,670
عند هذه النقطة.
331

331

00:16:49,670  -->  00:16:51,400
وإذا لم يكن كذلك، فلا تقلق،
332

332

00:16:51,400  -->  00:16:54,010
سوف نرى كل هذا يعمل على أرض الواقع
333

333

00:16:54,010  -->  00:16:56,060
في الفيديو التالي.
334

334

00:16:56,060  -->  00:16:57,380
لكن في الوقت الحالي، على الرغم من ذلك،
335

335

00:16:57,380  -->  00:17:00,350
هناك شيء آخر يجب أن نتحدث عنه،
336

336

00:17:00,350  -->  00:17:03,010
وهو الفرق بين سلسلة النطاق
337

337

00:17:03,010  -->  00:17:04,740
واستدعاء المكدس.
338

338

00:17:04,740  -->  00:17:08,360
أحصل على الكثير من الأسئلة حول هذا طوال الوقت.
339

339

00:17:08,360  -->  00:17:10,840
ولذا قررت أن أتحدث عنها
340

340

00:17:10,840  -->  00:17:13,900
كيف مكدس الاستدعاء، سياق التنفيذ،
341

341

00:17:13,900  -->  00:17:16,360
بيئات ونطاق متغير
342

342

00:17:16,360  -->  00:17:19,310
كلها مرتبطة ببعضها البعض.
343

343

00:17:19,310  -->  00:17:22,470
لذلك قبل أن ننتقل إلى الفيديو التالي.
344

344

00:17:22,470  -->  00:17:23,303
ومرة أخرى،
345

345

00:17:23,303  -->  00:17:25,703
دعونا نلقي نظرة على المزيد من التعليمات البرمجية هنا.
346

346

00:17:26,720  -->  00:17:31,550
لذلك لدينا ثلاث وظائف تسمى الأولى والثانية والثالثة،
347

347

00:17:31,550  -->  00:17:34,760
من أجل جعل هذا أسهل للفهم.
348

348

00:17:34,760  -->  00:17:37,430
نبدأ باستدعاء الدالة الأولى،
349

349

00:17:37,430  -->  00:17:39,730
والتي تستدعي بعد ذلك الوظيفة الثانية،
350

350

00:17:39,730  -->  00:17:42,950
والتي بدورها تستدعي الوظيفة الثالثة.
351

351

00:17:42,950  -->  00:17:45,130
إذن مما تعلمناه من قبل،
352

352

00:17:45,130  -->  00:17:50,130
مكدس الاستدعاءات لهذا المثال سيبدو هكذا، أليس كذلك؟
353

353

00:17:50,780  -->  00:17:53,870
سياق تنفيذ واحد لكل وظيفة
354

354

00:17:53,870  -->  00:17:57,250
بالترتيب الدقيق الذي تم استدعاؤهم به.
355

355

00:17:57,250  -->  00:17:59,910
كما أنها شملت البيئة المتغيرة
356

356

00:17:59,910  -->  00:18:02,570
لكل سياق التنفيذ.
357

357

00:18:02,570  -->  00:18:06,010
في الوقت الحالي، كل هذا لا علاقة له بالنطاقات
358

358

00:18:06,010  -->  00:18:08,490
أو سلسلة النطاق، حسنًا؟
359

359

00:18:08,490  -->  00:18:12,000
كل ما أفعله هو إنشاء سياق تنفيذ واحد
360

360

00:18:12,000  -->  00:18:14,560
لكل استدعاء دالة وملئها
361

361

00:18:14,560  -->  00:18:17,820
مع متغيرات تلك الدالة
362

362

00:18:17,820  -->  00:18:20,410
ويمكنك إيقاف الفيديو مؤقتًا هنا للحظة
363

363

00:18:20,410  -->  00:18:24,003
لفهم محتوى كل بيئة متغيرة.
364

364

00:18:25,440  -->  00:18:28,120
حسنًا، والآن بعد أن فعلت ذلك
365

365

00:18:28,120  -->  00:18:31,770
ولدينا كل هذه البيئات المتغيرة في مكانها الصحيح،
366

366

00:18:31,770  -->  00:18:35,250
يمكننا بالفعل البدء في بناء سلسلة النطاق.
367

367

00:18:35,250  -->  00:18:39,300
وكما هو الحال دائمًا، سنبدأ بالنطاق العالمي.
368

368

00:18:39,300  -->  00:18:42,390
والمتغيرات المتوفرة في النطاق العالمي
369

369

00:18:42,390  -->  00:18:46,360
هي بالضبط تلك المخزنة في البيئة المتغيرة
370

370

00:18:46,360  -->  00:18:49,160
سياق التنفيذ العالمي.
371

371

00:18:49,160  -->  00:18:52,020
وبالنظر إلى كل ما تعلمناه حتى الآن،
372

372

00:18:52,020  -->  00:18:54,670
هذا منطقي، أليس كذلك؟
373

373

00:18:54,670  -->  00:18:56,800
ولاحظ أنه في هذا المثال،
374

374

00:18:56,800  -->  00:19:00,640
أنا في الواقع أقوم بتضمين وظائف في كل نطاق
375

375

00:19:00,640  -->  00:19:03,283
على عكس ما فعلناه في الشريحة السابقة.
376

376

00:19:04,150  -->  00:19:08,110
الآن في النطاق العالمي، نسمي أيضًا الوظيفة الأولى،
377

377

00:19:08,110  -->  00:19:11,880
وهذا هو السبب وراء وجود سياق تنفيذ له
378

378

00:19:11,880  -->  00:19:13,530
في مكدس المكالمات.
379

379

00:19:13,530  -->  00:19:17,260
وهذه الوظيفة بالطبع لها نطاقها الخاص أيضًا،
380

380

00:19:17,260  -->  00:19:20,140
الذي يحتوي على كافة المتغيرات التي تم الإعلان عنها
381

381

00:19:20,140  -->  00:19:22,620
داخل الدالة.
382

382

00:19:22,620  -->  00:19:26,100
ومرة أخرى، هذا هو نفسه تمامًا
383

383

00:19:26,100  -->  00:19:27,900
كالبيئة المتغيرة
384

384

00:19:27,900  -->  00:19:30,820
من سياق تنفيذ الوظائف.
385

385

00:19:30,820  -->  00:19:32,930
ومع ذلك، هذا ليس كل شيء
386

386

00:19:32,930  -->  00:19:36,550
لأننا الآن نعرف بالفعل عن سلسلة النطاق.
387

387

00:19:36,550  -->  00:19:40,740
لذا فإن النطاق الأول يمكنه أيضًا الوصول إلى جميع المتغيرات
388

388

00:19:40,740  -->  00:19:42,440
من نطاقه الأصلي،
389

389

00:19:42,440  -->  00:19:44,353
بفضل سلسلة النطاق.
390

390

00:19:45,220  -->  00:19:46,860
والآن، كما نعلم بالفعل،
391

391

00:19:46,860  -->  00:19:49,530
سلسلة النطاق تدور حول الترتيب
392

392

00:19:49,530  -->  00:19:53,080
حيث تتم كتابة الوظائف في الكود.
393

393

00:19:53,080  -->  00:19:55,450
ولكن ما هو المهم حقا أن نلاحظ هنا
394

394

00:19:55,450  -->  00:19:59,400
هو أن سلسلة النطاق لا علاقة لها بالأمر
395

395

00:19:59,400  -->  00:20:01,370
حيث تم استدعاء الوظائف.
396

396

00:20:01,370  -->  00:20:05,180
أو بمعنى آخر، سلسلة النطاق ليس لها علاقة
397

397

00:20:05,180  -->  00:20:10,180
مع ترتيب سياقات التنفيذ في مكدس الاستدعاءات.
398

398

00:20:10,280  -->  00:20:13,590
تحصل سلسلة النطاق على البيئات المتغيرة
399

399

00:20:13,590  -->  00:20:17,960
من سياق التنفيذ كما هو موضح بواسطة الأسهم الحمراء هنا،
400

400

00:20:17,960  -->  00:20:19,520
ولكن هذا كل شيء.
401

401

00:20:19,520  -->  00:20:22,870
ترتيب استدعاءات الوظائف غير ذي صلة
402

402

00:20:22,870  -->  00:20:26,120
إلى سلسلة النطاق على الإطلاق، حسنا؟
403

403

00:20:26,120  -->  00:20:28,550
حقا ضع ذلك في الاعتبار.
404

404

00:20:28,550  -->  00:20:32,000
والآن ننتقل إلى الوظيفة الثانية الآن،
405

405

00:20:32,000  -->  00:20:37,000
ومرة أخرى، نطاقه يساوي بيئته المتغيرة.
406

406

00:20:37,280  -->  00:20:41,650
كما أنها مكتوبة بشكل معجمي داخل الوظيفة الأولى.
407

407

00:20:41,650  -->  00:20:43,000
وهكذا بالطبع،
408

408

00:20:43,000  -->  00:20:47,120
سيكون لديه حق الوصول إلى جميع نطاقاته الأصلية أيضًا.
409

409

00:20:47,120  -->  00:20:50,570
لذلك يمكننا أن نقول أن سلسلة النطاق في نطاق معين
410

410

00:20:50,570  -->  00:20:54,640
يساوي إضافة جميع البيئات المتغيرة معًا
411

411

00:20:54,640  -->  00:20:57,000
من جميع النطاقات الأم.
412

412

00:20:57,000  -->  00:20:58,790
وهذا هو نطاقنا،
413

413

00:20:58,790  -->  00:21:02,230
ويتم إنشاء سلسلة النطاق في محرك JavaScript
414

414

00:21:02,230  -->  00:21:03,663
خلف الكواليس.
415

415

00:21:04,650  -->  00:21:05,650
تمام.
416

416

00:21:05,650  -->  00:21:07,700
والآن في الدالة الثانية
417

417

00:21:07,700  -->  00:21:11,220
نحاول استدعاء الوظيفة الثالثة.
418

418

00:21:11,220  -->  00:21:13,270
ولكن لماذا يعمل هذا؟
419

419

00:21:13,270  -->  00:21:16,150
حسنا، إنه يعمل لأن الوظيفة الثالثة
420

420

00:21:16,150  -->  00:21:20,010
موجود في سلسلة النطاق لنطاق الوظيفة الثاني
421

421

00:21:20,010  -->  00:21:23,770
كما يمكننا أن نرى هنا في مخطط سلسلة نطاقنا.
422

422

00:21:23,770  -->  00:21:28,470
إنها وظيفة في النطاق العالمي أو وظيفة عالمية،
423

423

00:21:28,470  -->  00:21:32,030
وبالتالي يمكن الوصول إليه في كل مكان.
424

424

00:21:32,030  -->  00:21:34,740
وبطبيعة الحال، سيؤدي هذا إلى إنشاء نطاق جديد
425

425

00:21:34,740  -->  00:21:38,363
جنبا إلى جنب مع سلسلة النطاق كما نعلم بالفعل.
426

426

00:21:39,230  -->  00:21:43,330
عظيم، فماذا يحدث في هذه الوظيفة الثالثة؟
427

427

00:21:43,330  -->  00:21:47,120
حسنًا، نحن نحاول التصرف كمتغيرات B، C،
428

428

00:21:47,120  -->  00:21:49,750
د و أ هنا.
429

429

00:21:49,750  -->  00:21:53,160
D لا توجد مشكلة لأنه هناك
430

430

00:21:53,160  -->  00:21:55,330
في نطاق الوظيفة الثالثة.
431

431

00:21:55,330  -->  00:21:57,610
لذلك هذا سهل.
432

432

00:21:57,610  -->  00:22:01,460
إذن المتغير C ليس في نطاق محلي
433

433

00:22:01,460  -->  00:22:05,460
ولذلك يحتاج جافا سكريبت إلى إجراء بحث متغير.
434

434

00:22:05,460  -->  00:22:07,810
لذلك فإنه يبحث في سلسلة النطاق
435

435

00:22:07,810  -->  00:22:10,120
البحث عن المتغير C
436

436

00:22:10,120  -->  00:22:12,300
ولكنها ليست هناك.
437

437

00:22:12,300  -->  00:22:14,010
وبالطبع ليس كذلك،
438

438

00:22:14,010  -->  00:22:17,510
لأن C محددة في الوظيفة الثانية،
439

439

00:22:17,510  -->  00:22:20,980
ولا توجد طريقة تؤدي بها الوظيفة الثالثة
440

440

00:22:20,980  -->  00:22:25,420
يمكن الوصول إلى المتغيرات المحددة في الوظيفة الثانية.
441

441

00:22:25,420  -->  00:22:26,540
وهذا صحيح،
442

442

00:22:26,540  -->  00:22:30,640
على الرغم من أن الوظيفة الثانية هي التي اتصلت بالثالثة.
443

443

00:22:30,640  -->  00:22:32,780
وهنا دليل أكثر
444

444

00:22:32,780  -->  00:22:35,400
أن الترتيب الذي يتم استدعاء الوظائف
445

445

00:22:35,400  -->  00:22:38,840
لا يؤثر على سلسلة النطاق على الإطلاق.
446

446

00:22:38,840  -->  00:22:40,970
وهكذا هنا نتيجة لذلك،
447

447

00:22:40,970  -->  00:22:42,990
نحصل على الخطأ المرجعي
448

448

00:22:42,990  -->  00:22:46,700
لأنه لا يمكن العثور على كل من C وB
449

449

00:22:46,700  -->  00:22:50,063
في النطاق الثالث ولا في سلسلة النطاق.
450

450

00:22:51,030  -->  00:22:51,863
تمام.
451

451

00:22:51,863  -->  00:22:54,810
وبهذا، أتمنى أن أكون قد أوضحت الأمر تمامًا
452

452

00:22:54,810  -->  00:22:58,540
سياق التنفيذ، والبيئات المتغيرة،
453

453

00:22:58,540  -->  00:23:03,240
نطاق مكدس الاستدعاءات وسلسلة النطاق مختلفان تمامًا،
454

454

00:23:03,240  -->  00:23:06,040
ولكن لا تزال المفاهيم ذات الصلة للغاية.
455

455

00:23:06,040  -->  00:23:08,450
وإذا لم يكن الأمر واضحًا تمامًا بعد،
456

456

00:23:08,450  -->  00:23:12,220
فلا توجد مشكلة في إعادة مشاهدة هذه الشريحة،
457

457

00:23:12,220  -->  00:23:15,423
أو ربما حتى هذه المحاضرة بأكملها بعد قليل.
458

458

00:23:16,540  -->  00:23:19,830
وأنا أعلم أن هذه كانت محاضرة طويلة جدًا
459

459

00:23:19,830  -->  00:23:23,000
مع الكثير من الأشياء لاستيعابها.
460

460

00:23:23,000  -->  00:23:25,250
وهنا ملخص مفيد
461

461

00:23:25,250  -->  00:23:28,830
مع الوجبات الرئيسية من هذا الفيديو.
462

462

00:23:28,830  -->  00:23:32,667
لذا في البداية، يطرح تحديد النطاق السؤال،
463

463

00:23:32,667  -->  00:23:34,990
"أين تعيش المتغيرات؟"
464

464

00:23:34,990  -->  00:23:38,277
أو "أين يمكننا الوصول إلى متغير معين،
465

465

00:23:38,277  -->  00:23:39,860
"وأين لا؟"
466

466

00:23:39,860  -->  00:23:42,623
هذا هو كل ما يتعلق بتحديد النطاق.
467

467

00:23:43,480  -->  00:23:47,230
الآن، هناك ثلاثة أنواع من النطاق في JavaScript.
468

468

00:23:47,230  -->  00:23:50,810
النطاق العالمي، النطاقات التي تحددها الوظائف
469

469

00:23:50,810  -->  00:23:55,570
والنطاقات المحددة بواسطة الكتل، بدءًا من ES6.
470

470

00:23:55,570  -->  00:24:00,200
ومع ذلك، فإن متغيرات Let وconst فقط هي التي يتم تحديد نطاقها.
471

471

00:24:00,200  -->  00:24:04,030
تنتهي المتغيرات المعلنة باستخدام var تلقائيًا
472

472

00:24:04,030  -->  00:24:05,993
في أقرب نطاق وظيفة.
473

473

00:24:06,830  -->  00:24:10,590
التالي في جافا سكريبت، لدينا النطاق المعجمي،
474

474

00:24:10,590  -->  00:24:14,580
وهو ما يعني أن القواعد حيث يمكننا الوصول إلى المتغيرات
475

475

00:24:14,580  -->  00:24:17,100
تعتمد على مكان وجود وظائف التعليمات البرمجية
476

476

00:24:17,100  -->  00:24:18,943
والكتل مكتوبة.
477

477

00:24:19,820  -->  00:24:22,580
والآن، دع السحر يبدأ،
478

478

00:24:22,580  -->  00:24:25,820
لأن كل نطاق لديه حق الوصول دائمًا
479

479

00:24:25,820  -->  00:24:29,710
لجميع المتغيرات من جميع نطاقاتها الخارجية.
480

480

00:24:29,710  -->  00:24:32,890
وهذا ما نسميه سلسلة النطاق.
481

481

00:24:32,890  -->  00:24:36,630
عندما لا يكون متغير معين في النطاق الحالي،
482

482

00:24:36,630  -->  00:24:39,150
يبحث المحرك في سلسلة النطاق
483

483

00:24:39,150  -->  00:24:42,630
حتى يجد المتغير الذي يبحث عنه،
484

484

00:24:42,630  -->  00:24:46,240
وتسمى هذه العملية بالبحث المتغير.
485

485

00:24:46,240  -->  00:24:48,720
من المهم أن نلاحظ أن سلسلة النطاق
486

486

00:24:48,720  -->  00:24:50,850
هو شارع ذو اتجاه واحد.
487

487

00:24:50,850  -->  00:24:55,300
لذلك لن يتمكن النطاق مطلقًا من الوصول إلى المتغيرات
488

488

00:24:55,300  -->  00:24:59,620
من النطاق الداخلي، فقط من النطاقات الخارجية.
489

489

00:24:59,620  -->  00:25:03,490
يمكننا أيضًا التفكير في سلسلة النطاق في نطاق معين
490

490

00:25:03,490  -->  00:25:05,690
باعتبارها مساوية للجمع معا
491

491

00:25:05,690  -->  00:25:10,280
جميع البيئات المتغيرة لجميع النطاقات الأصلية.
492

492

00:25:10,280  -->  00:25:12,780
وأخيرا، علينا أن نضع في اعتبارنا
493

493

00:25:12,780  -->  00:25:15,350
أن سلسلة النطاق ليس لها علاقة
494

494

00:25:15,350  -->  00:25:18,970
مع الترتيب الذي تم استدعاء الوظائف.
495

495

00:25:18,970  -->  00:25:21,460
لذا فإن ترتيب استدعاءات الوظيفة
496

496

00:25:21,460  -->  00:25:24,343
لا يؤثر على سلسلة النطاق على الإطلاق.
497

497

00:25:25,260  -->  00:25:27,920
حسنا، والآن هذا هو في الواقع.
498

498

00:25:27,920  -->  00:25:32,410
هذا باختصار، تحديد النطاق في جافا سكريبت.
499

499

00:25:32,410  -->  00:25:34,363
نراكم في الفيديو التالي.

